"""
寻找宿舍门的密码:
今天早上，你的室友因为睡过头被锁在了宿舍里。
宿舍的门安装了一把高级密码锁。
当尝试解锁时，锁会生成一串包含随机英文字母和数字的字符串。为了解锁，你需要从这串字符串中找出所有的数字，按大小排序后组合成一个整数。
此外，你还需要获取所有室友当前位置的经纬度，并将经纬度的小数部分相加。
然后，你需要将这个整数与经纬度小数部分的和相乘，取结果的前8位数字作为解锁密码。

先编写一个 gen_txt 函数，它会生成一个包含100位随机英文数字字符的字符串，其中包含10位数字。
然后请编写一个名为 unlock_door 的函数，它接受上面生成的随机字符串和一个包含室友经纬度的列表，并返回一个字符串作为解锁密码。

例如：
random_string = gen_txt()
locations = [(120.12345, 30.04321), (121.03456, 31.95678), (122.04567, 32.06789)]   # 3个舍友的经度，纬度
password = unlock_door(random_string, locations)
print(password)
"""
import random
import string


def gen_txt():
    """
    生成一个包含 100 位随机英文字母和数字的字符串，其中包含 10 位数字
    :return: 生成的随机字符串
    """
    num_chars = 10
    letter_chars = 90
    all_chars = string.ascii_letters + string.digits
    random_string = ''
    for i in range(num_chars):
        random_string += random.choice(string.digits)
    for i in range(letter_chars):
        random_string += random.choice(string.ascii_letters)
    random_list = list(random_string)
    random.shuffle(random_list)
    random_string = ''.join(random_list)
    return random_string


def unlock_door(random_string, locations):
    """
    此函数用于计算解锁密码。它会从随机字符串中提取数字，将其按大小排序并组合成一个整数。
    然后计算室友经纬度的小数部分之和。将两者相乘，取结果的前 8 位数字作为解锁密码。
    :param random_string: 包含随机英文字母和数字的字符串
    :param locations: 包含室友经纬度的列表
    :return: 解锁密码，以字符串形式表示
    """
    # 从随机字符串中提取数字并排序
    numbers = [int(char) for char in random_string if char.isdigit()]
    numbers.sort()
    num_str = ''.join(str(num) for num in numbers)
    num = int(num_str)

    # 计算经纬度小数部分之和
    decimal_sum = 0
    for lon, lat in locations:
        decimal_sum += (lon - int(lon)) + (lat - int(lat))

    # 相乘并取前 8 位数字
    result = str(num * decimal_sum)[:8]
    return result
# 测试函数
if __name__ == "__main__":
    random_string = gen_txt()
    locations = [(120.12345, 30.04321), (121.03456, 31.95678), (122.04567, 32.06789)]
    password = unlock_door(random_string, locations)
    print(password)


